package com.banyuan.lesson.exception;

/*
 * Throwable 可抛出的（所有的错误）；
 * Error（比较严重的错误 内存溢出）；
 * Expection（轻量级的错误）；
 * 运行时异常 RuntimeException UncheckedException 未检查的异常；
 * 比较低级的错误 编译期不会强迫你去处理这类异常，可以自己手动去try-catch；
 *
 * 非运行时异常 很多类 CheckedException 已检查的异常；
 * 相对比较高级一些的错误 编译期会强迫你去处理这类异常；
 * 1、throws抛出异常
 * 2、立刻捕获，一般先抛出，然后再某个外层的方法处理；
 *
 * 异常会压到一个栈中；
 * 栈顶的信息一般是最接近问题的代码；
 *
 * 方法的退出有两种；
 * 正常退出（return）和异常退出（Exception）；
 *
 * 异常处理的方式有两种
 * 1、throws 抛出（抛给调用的方法）
 * 2、try-catch 捕获
 *    try代表捕获的范围，一旦被捕获就不会向外扩散了
 *    catch代表捕获的目标以及捕获之后的处理
 *
 * throw Exceptions表示该方法可能会抛出异常；
 *
 * 一段代码只会抛出一个异常；
 * 一个异常只会捕获一次，当catch捕获异常之后，下面的catch到这个异常之后就不会执行；
 *
 * 尽量不要用异常做分支处理，效率是正常流程的30%；
 * 除非某种重要的也比较少见的错误；
 *
 * 父类的异常不能发在子类异常分支的前面，这样子类异常分支将永远不会执行，成为一段死代码；
 *
 * 尽量不要用try-catch嵌套；
 *
 * 多个catch时可以采用jdk1.7中分支或起来；
 *
 *
 * 关键字finally，无论是否出现异常，都会执行finally代码块；
 * finally中一般存放无论程序是否正确执行，都需要执行的命令，比如内存的释放；
 *
 * throws 用在方法的声明，表示该方法可能会抛出某种异常
 * throw
 *
 * throw
 * */

import com.banyuan.lesson.object类.Animal;
import com.banyuan.lesson.object类.Dog;
import com.banyuan.lesson.polymorphism.Cat;

public class Define {
    public static void main(String[] args) {
        String s = null;

        //NullPointerException 空指针异常
        System.out.println(s.length());

        //ArithmeticException
        System.out.println(10 / 0);

        //输出是infinity，无限
        System.out.println(10.0 / 0);

        //ArrayIndexOUtOfBoundsException 数组下标越界
        int[] arr = new int[5];
        arr[5] = 10;

        //StringIndexOutOfBoundsException 字符串下标越界
        System.out.println("aaa".charAt(3));

        //ClassCastException 类型转换异常

        //NumberFormatException 数字格式化异常
        int i = Integer.valueOf("a12");


        //finally的面试题
        method();


    }

    //结果会返回一个2,先return0，再return2覆盖0；
    public static int method() {
        try {
            return 0;
        } catch (Exception e) {
            return 1;
        } finally {
            return 2;
        }
    }
}
